package main

import (
	"chat-im/controller"
	_ "chat-im/controller"
	_ "github.com/go-sql-driver/mysql"
	"html/template"
	"log"
	"net/http"
)

// 注册视图
func RegisterView() {
	//把模版解析并且显示出来
	//tpl得到模版的指针
	//ParseGlob 满足这种格式的都可以解析出来 ** 表示目录  * 表示文件
	tpl, err := template.ParseGlob("view/**/*") //filename是模版的相对路径
	//如果报错就不用继续走啦
	if err != nil {
		//直接退出和fmt.Printf不一样
		log.Fatal(err.Error()) //Fatal函数作用，如果模版渲染出错了，这个应用不用往下跑了，直接退出
	}

	for _, v := range tpl.Templates() {
		//参数2 模版的名称是view视图上方define定义的名字
		//参数3 需要往视图传递的数据，不需要nil
		tplname := v.Name()
		//循环注册
		http.HandleFunc(tplname, func(writer http.ResponseWriter, request *http.Request) {
			tpl.ExecuteTemplate(writer, tplname, nil)
		})
	}

}

func main() {
	//把前端请求的格式和封装处理函数进行绑定的标签
	//绑定请求和处理函数
	http.HandleFunc("/user/login", controller.UserLogin) //函数名，不要加圆括号
	//注册路由
	http.HandleFunc("/user/register", controller.UserRegister)              //函数名，不要加圆括号
	http.HandleFunc("/contact/loadcommunity", controller.LoadCommunity)     //加在群聊
	http.HandleFunc("/contact/loadfriend", controller.LoadFriend)           //加载好友列表
	http.HandleFunc("/contact/joincommunity", controller.JoinCommunity)     //加群
	http.HandleFunc("/contact/createcommunity", controller.CreateCommunity) //创建群聊
	http.HandleFunc("/contact/addfriend", controller.Addfriend)             //添加朋友
	http.HandleFunc("/chat", controller.Chat)                               //添加朋友

	http.HandleFunc("/attach/upload", controller.Upload) //文件上传

	//1.提供静态资源目录支持
	//http.Handle("/", http.FileServer(http.Dir("."))) //当前目录
	//2.提供指定目录的静态文件支持
	http.Handle("/asset/", http.FileServer(http.Dir("."))) //第一个是格式
	http.Handle("/mnt/", http.FileServer(http.Dir(".")))
	/*
		//定义可以允许访问的模版 user/login.shtml
		http.HandleFunc("/user/login.shtml", func(writer http.ResponseWriter, request *http.Request) {
			//把模版解析并且显示出来
			//tpl得到模版的指针
			tpl, err := template.ParseFiles("view/user/login.html") //filename是模版的相对路径
			if err != nil {
				//直接退出和fmt.Printf不一样
				log.Fatal(err.Error()) //Fatal函数作用，如果模版渲染出错了，这个应用不用往下跑了，直接退出
			}

			//参数2 模版的名称是view视图上方define定义的名字
			//参数3 需要往视图传递的数据，不需要nil
			tpl.ExecuteTemplate(writer, "/user/login.shtml", nil)
		})

		//定义可以允许访问的模版 user/register.shtml
		http.HandleFunc("/user/register.shtml", func(writer http.ResponseWriter, request *http.Request) {
			//把模版解析并且显示出来
			//tpl得到模版的指针
			tpl, err := template.ParseFiles("view/user/register.html") //filename是模版的相对路径
			if err != nil {
				//直接退出和fmt.Printf不一样
				log.Fatal(err.Error()) //Fatal函数作用，如果模版渲染出错了，这个应用不用往下跑了，直接退出
			}

			//参数2 模版的名称是view视图上方define定义的名字
			//参数3 需要往视图传递的数据，不需要nil
			tpl.ExecuteTemplate(writer, "/user/register.shtml", nil)
		})
	*/

	RegisterView()
	//启动web服务器
	http.ListenAndServe(":8080", nil)
}
